Programmare con Python: Guida completa by Marco Buttu

Programmare con Python: Guida completa by Marco Buttu

autore:Marco Buttu
La lingua: ita
Format: azw3, mobi
editore: LSWR Srl
pubblicato: 2014-12-25T23:00:00+00:00


Import circolari

Quando due moduli si importano a vicenda, si dice che si ha un import circolare (circular import). Gli import circolari sono causa, talvolta, di problemi la cui risoluzione non è immediata. Consideriamo, ad esempio, i seguenti due moduli:

$ ls

main.py mymodule.py

Il modulo main stampa il suo nome, poi importa mymodule e infine assegna la stringa 'main.py' all’etichetta a:

$ cat main.py

print(__name__)

import mymodule

a = 'main.py'

Il modulo mymodule, invece, stampa il suo nome, assegna la stringa 'mymodule.py' all’etichetta a, importa il modulo principale del programma e infine stampa l’etichetta a di quest’ultimo:

$ cat mymodule.py

print(__name__)

a = 'mymodule.py'

import __main__

print(__main__.a)

Ecco cosa accade se eseguiamo mymodule.py da linea di comando:

$ python mymodule.py

__main__

mymodule.py

Viene stampato il nome del modulo, che è '__main__', visto che mymodule.py è stato eseguito da linea di comando. Poi viene eseguita l’istruzione import __main__, la quale, però, non importa __main__ poiché questo è già in esecuzione e quindi presente su sys.modules; l’unico effetto di import __main__ è quello di rendere disponibile l’etichetta __main__. Viene infine stampata __main__.a, ovvero la stringa 'mymodule.py' assegnata all’etichetta a due istruzioni sopra la print().

Ecco, invece, cosa accade se eseguiamo main.py da linea di comando:

$ python main.py

__main__

mymodule

Traceback (most recent call last):

...

AttributeError: 'module' object has no attribute 'a'

Viene stampato il nome del modulo, che anche questa volta è '__main__', visto che main.py è stato eseguito da linea di comando. Fatto ciò, però, prima che venga assegnata l’etichetta a viene importato mymodule, e questa istruzione comporta l’esecuzione del codice contenuto in mymodule.py, ovvero:

1. print(__name__): stampa il nome del modulo, ovvero mymodule;

2. a = 'mymodule.py': assegna la stringa 'mymodule.py' all’etichetta a nel namespace di mymodule;

3. import __main__: il modulo __main__ (associato al file eseguito da linea di comando, main.py) è già presente in sys.modules, quindi non viene importato, e questa istruzione ha il solo effetto di rendere disponibile l’etichetta __main__ nel modulo mymodule;

4. print(__main__.a): questa istruzione dovrebbe stampare __main__.a. Quando, però, Python prova a risolvere l’etichetta a nel namespace del modulo principale, non la trova. Infatti questa etichetta non è stata ancora definita, poiché il flusso di esecuzione in main.py è ancora fermo alla penultima istruzione, import mymodule.

Per evitare questo genere di problemi, possiamo adottare le pratiche elencate alla pagina Programming FAQ del sito ufficiale: http://docs.python.org/3/faq/programming.html, alla sezione intitolata What are the “best practices” for using import in a module?.

Concludiamo questa sezione con una osservazione in merito al modulo __main__. Quando un file mymodule.py viene eseguito da linea di comando, il suo contenuto viene caricato in memoria e associato a un modulo chiamato __main__. Quindi è quest'ultimo a essere presente in sys.modules e non mymodule. Se, pertanto, in mymodule.py avessimo importato main piuttosto che __main__, il problema non si sarebbe presentato:

$ cat mymodule.py

print(__name__)

a = 'mymodule.py'

import main

print(main.a)

$ python main.py

__main__

mymodule

main

main.py

Questo perché, quando il modulo main.py viene eseguito da linea di comando, il suo codice viene caricato in memoria e assegnato al modulo __main__, quindi è questo a essere presente in sys.modules e non main:

$ cat mymodule.py

print(__name__)

a = 'mymodule.py'

import sys

print("'__main__' in sys.modules?", '__main__' in sys.modules)

print("'main' in sys.modules?", 'main' in sys.modules)

import main

print("Dopo l'import: 'main' in sys.modules?", 'main' in sys.



scaricare



Disconoscimento:
Questo sito non memorizza alcun file sul suo server. Abbiamo solo indice e link                                                  contenuto fornito da altri siti. Contatta i fornitori di contenuti per rimuovere eventuali contenuti di copyright e inviaci un'email. Cancelleremo immediatamente i collegamenti o il contenuto pertinenti.
Ebooks popolari
Designing Mobile Interfaces by Steven Hoober & Eric Berkman(2227)
Mobile HTML5 by Estelle Weyl(2177)
La Sicurezza Informatica. Tra informatica, matematica e diritto (Italian Edition) by Francesca Cirini(1946)
Hello World by Hannah Fry(1942)
Il Manuale Di Arduino by Maik Schmidt(1768)
Linux server per l'amministratore di rete: per Ubuntu, CentOS e Fedora (Italian Edition) by Silvio Umberto Zanzi(1512)
Nel paese degli algoritmi by Aurélie Jean(1498)
Esercizi Di Stile by Unknown(1292)
Sviluppare in PHP 7: Realizzare applicazioni web e API professionali (Italian Edition) by Enrico Zimuel(1112)
E-LEARNING by E-learning(1077)
PYTHON : Il manuale per imparare a programmare. Contiene esempi di codice ed esercizi pratici. (Italian Edition) by Frost Oscar R(1064)
Tutto Mac for dummies: iPhone, iPad, MacBook, iCloud e molto altro by Simone Gambirasio(1059)
Automatizzare le cose noiose con Python: Programmazione pratica per principianti assoluti (Italian Edition) by Sweigart Al(1051)
Novacene by James Lovelock(1035)
9 algoritmi che hanno cambiato il futuro by MacCormick John(971)
Comprendere gli Algoritmi e i diagrammi di flusso passo-passo: Esempi con ausili grafici e tabellari, esercizi e codifica in linguaggio C (Italian Edition) by Luciano Manelli(942)
Amazon by Sconosciuto(934)
On Writing by Stephen King(919)
WEB DEVELOPMENT: La guida completa allo sviluppo web lato client. Impara a programmare con esercizi pratici ed esempi di codice. Include HTML, CSS, PHP, PYTHON, MySQL (Italian Edition) by Ferrati Alberto(915)
Android 4 by Massimo Carli(912)